#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "eratostenes.h"

#define TAM_PALAVRA 200

/* Função para calcular o tempo de execução */
double tempo()
{
    struct timeval tv;
    gettimeofday(&tv,0);
    return tv.tv_sec + tv.tv_usec/1e6;
}

/*Pega a proxima palavra no arquivo até um caracter que não seja letra*/
void get_palavra(FILE *fp, char* buffer){
  int i = 0;
  char c;
  
  c = fgetc(fp);
  while(!isalpha(c) && c != EOF){		
    c = fgetc(fp);
  }
  while(isalpha(c) || c == '-' || c == '\''){
    buffer[i] = c;
    c = fgetc(fp);
    i++;
    if(i > TAM_PALAVRA)
      exit(1);
  }
  buffer[i] = '\0';
}

/* Função que verifica se é um palíndromo */
int verifica_palindromo(char *palavra, int *contador){
  int i, j;
  /* Palavras de só uma letra não são consideradas palíndromos */
  if(strlen(palavra) <= 1){
    return 0;
  }  
  /* Verifica palíndromo em palavras com mais de uma letra */
  for(i = 0, j = strlen(palavra)-1; i <=j; i++, j--){
    while(!isalpha(palavra[i])) i++;
    while(!isalpha(palavra[j])) j--;
    if(tolower(palavra[i]) != tolower(palavra[j])){
      return 0;
    }
  }
  /* É palíndromo */
  *contador = *contador + 1;
  return 1;
}


int main(void){
  FILE *fp;
  
  /* Offset para início e fim de leitura do arquivo */
  long posEnd;
  
  /* Variável para a palavra lida */
  char buffer[TAM_PALAVRA];
  
  /* Variáveis de contagem */
  int num_palindromos = 0, num_primos;
  
  /* Variáveis para registrar o tempo de início e término de execução */
  double start, end;
  
  /* Registra tempo de início */
  start = tempo();
  
  /* Prepara o vetor de primos */
  initPrimos(&num_primos);

  fp = fopen("wikipedia.txt", "r");
  if(fp < 0){
    printf("Arquivo não encontrado\n");
    exit(-1);
  }
  
  /* Vou para o final do arquivo para pegar a posicao final */
  fseek(fp, 0, SEEK_END);

  /* Calculo o valor da pos final */
  posEnd = ftell(fp);
  
  /* Volto para a posicao inicial */
  fseek(fp, 0, SEEK_SET);

  /* Loop que lê as palavras */
  while(1){
    get_palavra(fp, buffer);
    /* Verifica se esta na posicao final ou ja passou */
    if(ftell(fp) >= posEnd) break;
 
    /* Verifica se é palindromo e, caso seja, verifica se é primo */
    if(verifica_palindromo(buffer, &num_palindromos)){
      num_primos += verificaPrimo(buffer);	
    }
  }

  /* Registra tempo de fim */
  end = tempo();
  
  /* Resultados */
  printf("Numero total de palíndromos = %d.\n", num_palindromos);
  printf("Numero total de palíndromos que são primos = %d.\n", num_primos);
  printf("Tempo de execucao = %f segundos\n", end-start);
  
  /*Fecha os arquivos de entrada e saida*/
  fclose(fp);
  
  return 0;
}
